package cn.zn.framework.common.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.zn.framework.common.exception.RRException;

import java.util.List;

public class CodeUtil {

    /**
     * 生成编码
     *
     * @param type      编码类型：1-数字（默认），2-时间戳（后加3位随机数）
     * @param length    编码长度:不包括前后缀，0-不限（默认），如生成的编码大于此值，以实际生成的编码为准，type=1时必填
     * @param number    生成编码的数字，长度小于length前面补0，type=1时必填
     * @param prefix    前缀
     * @param suffix    后缀
     * @param separator 分隔符，分隔前缀、编号、后缀，默认为空
     * @return
     */
    public static String buildCode(Integer type, Integer length, Integer number, String prefix, String suffix, String separator) {
        if (length == null) {
            length = 0;
        }
        List<String> builds = CollUtil.newArrayList();
        if (prefix != null) {
            builds.add(prefix.trim());
        }
        switch (type) {
            case 1:
                if (number == null) {
                    throw new RRException("number 不能为空");
                }
                String numberStr = String.valueOf(number);
                if (length > 0 && length > numberStr.length()) {
                    numberStr = StrUtil.fillBefore(numberStr, '0', length);
                }
                builds.add(numberStr);
                break;
            case 2:
                long currentSeconds = System.currentTimeMillis();
                String randomNumbers = RandomUtil.randomNumbers(3);
                builds.add(Long.valueOf(currentSeconds).toString().concat(randomNumbers));
                break;
            default:
        }
        if (suffix != null) {
            builds.add(suffix.trim());
        }
        if (separator == null) {
            separator = "";
        }
        return StrUtil.join(separator, builds);
    }
}
